package com.edais.actions;

import com.edais.domain.RunningSignUpInfo;
import com.edais.service.CaptchaService;
import com.edais.service.RunningService;
import com.edais.service.SMSService;
import com.edais.service.UserService;
import com.edais.util.*;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/sendSMS")

public class SendSMSAction  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static final Log logger = LogFactory.getLog(SendSMSAction.class);

	@Autowired
	private SMSService sMSService;
	
	@Autowired
	private UserService userService; 
	
	@Autowired
	private CaptchaService captchaService;
	
	
	@Autowired
	private RunningService runningService;
	
	
	/** 推送个推消息
	 * @param request
	 * @return response
	 * @throws Exception */
	@RequestMapping(value = "/sendGetuiMSG")
	public void sendGetuiMSG(HttpServletRequest request, HttpServletResponse response){
		JSONObject jsonrst=null;
		try {
			Map<String, String> paramsMap = CommonUtil.decryptParamters(request);// 解密请求参数
			String smsNo=paramsMap.get("smsNo");//config_sms表中参数,
			String userId = paramsMap.get("userId");// 用户ID
			String mobile =paramsMap.get("userId");
			if (("sms01001".equals(smsNo)||"sms05001".equals(smsNo))&&(null==mobile||"".equals(mobile))) {//充值、提现类的消息，要加上用户姓名
				try {
					mobile = captchaService.getMobileById(userId);//通过用户ID查询使用手机号
				} catch (Exception e) {
					e.printStackTrace();
					logger.error("sendSMS/sendGetuiMSG 通过用户ID查询使用手机号，再通过手机号查询姓名时出现异常:充值、提现类的消息，要加上用户姓名。" + e.getMessage());
					jsonrst=JSONObject.fromObject("sendSMS/sendGetuiMSG 通过用户ID查询使用手机号，再通过手机号查询姓名时出现异常:充值、提现类的消息，要加上用户姓名。" + e.getMessage());
					CommonUtil.responseJson(jsonrst, response);
				}
			}
			String title= paramsMap.get("title");//标题
			String messageDetailTypeNew=paramsMap.get("messageDetailTypeNew");//1.订制商品个人消息，2.充值或还款成功个人消息
			String messageDetailResult=paramsMap.get("messageDetailResult");//0.执行成功消息提示，1.执行失败提示
			String smsParams=paramsMap.get("smsParams");//消息模板里需要替换的变量，以逗号，分隔
			String[] smsParamsArr=smsParams.split(",");
			if (StringUtils.isBlank(userId) || StringUtils.isBlank(smsNo)) {
				logger.info("/sendSMS/sendGetuiMSG 传入参数为空");
				jsonrst=JSONObject.fromObject("/sendSMS/sendGetuiMSG 传入参数为空");
				CommonUtil.responseJson(jsonrst, response);
			}
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("userId", userId);
			map.put("mobile", mobile);
			map.put("title", title);
			map.put("messageDetailTypeNew", messageDetailTypeNew);
			map.put("messageDetailResult", messageDetailResult);
			map.put("smsParams", smsParamsArr);
			map.put("smsNo", smsNo);
		    jsonrst=sMSService.sendGetuiMSG(map);
			CommonUtil.responseJson(jsonrst, response);//返回发送结果
		} catch (Exception e1) {
			e1.printStackTrace();
			logger.error("sendSMS/sendGetuiMSG 异常:" + e1.getMessage());
			jsonrst=JSONObject.fromObject("sendSMS/sendGetuiMSG 异常:" + e1.getMessage());
			CommonUtil.responseJson(jsonrst, response);
		}
	}
	
	
	
	/** 获取短信发送
	 * @param request
	 * @return response
	 * @throws Exception */
	@RequestMapping(value = "/getSMS")
	public void getSMS(HttpServletRequest request, HttpServletResponse response){
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		
		// 解密请求参数
		Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
		// 用户ID
		String userId = paramsMap.get("userId");
		// 产品类别：
		String cpType = paramsMap.get("cpType");
		//Method名称：
		String smsNo=paramsMap.get("smsNo");
		//提示金额
		String je=paramsMap.get("tsje");
		//校验用户id
		if (StringUtils.isBlank(userId) 
				|| StringUtils.isBlank(smsNo)|| StringUtils.isBlank(je)) {
			logger.info("/sendSMS/getSMS 传入参数为空");
			return;
		}
		try{
			// 发送短信
			if(StringUtils.isEmpty(cpType)){
				jsonMap = sMSService.getSMS(userId,smsNo,je);	
			}else{
				jsonMap = sMSService.getSMS(userId,smsNo,je,cpType);	
			}
					
			// 处理返回结果
			String result = JsonUtil.getJsonStringFromMap(jsonMap);
			//CommonUtil.responseJson(result, response);
		} catch (Exception e) {
			logger.error("sendSMS/getSMS 异常:" + e.getMessage());
//			jsonMap.put("rescode", Consts.ERROR_CODE);
//			jsonMap.put("resmsg", Consts.ErrorMsg.MSG00001);
//			jsonMap.put("resmsg_cn", Message.CnDescriptionExpression.BUSINESSE_ERROR);
//			String result = JsonUtil.getJsonStringFromMap(jsonMap);
//			CommonUtil.responseJson(result, response);
		}		
	}
	
	/**
	 * 获取验证码
	 * 
	 * @param request
	 * @return response
	 * @throws Exception
	 */
	@RequestMapping(value = "/captcha")
	public void getCaptcha(HttpServletRequest request, HttpServletResponse response){
		// 解密请求参数
		Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
		
		try{
			// 数据检查
			Map<String,String> checkMap = getCaptchaCheck(paramsMap);
			if (null == checkMap || !Consts.SUCCESS_CODE.equals(checkMap.get("code"))) {
				String result = CommonUtil.setResultStringCn(
						new HashMap<String, Object>(), checkMap.get("code"),
						"", checkMap.get("message"));
				// 处理返回结果
				CommonUtil.responseJson(result, response);
				return;
			}
			
			//业务处理
			paramsMap.put("userMobile", checkMap.get("userMobile"));
			String result = sMSService.getCaptcha(paramsMap);
			CommonUtil.responseJson(result, response);
		}catch(Exception e){
			logger.error("获取验证码发生异常:" + e.getMessage());
			String result = CommonUtil.setResultStringCn(new HashMap<String, Object>(),
					Consts.ERROR_CODE, "",
					Message.CnDescriptionExpression.GET_CAPTCHA_FAILED);
			CommonUtil.responseJson(result, response);
		}
	}
	/** 获取短信发送,不带【糯糯金融】
	 * @param request
	 * @return response
	 * @throws Exception */
	@RequestMapping(value = "/getSMSKz")
	public void getSMSKz(HttpServletRequest request, HttpServletResponse response){
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		
		// 解密请求参数
		Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
		// 用户ID
		String userId = paramsMap.get("userId");
		// 参数2：
		String parm2 = paramsMap.get("parm2");
		//Method名称：
		String smsNo=paramsMap.get("smsNo");
		// 参数1：
		String parm1=paramsMap.get("parm1");
		//如果传报名订单了，需要特殊处理
		if(paramsMap.containsKey("orderIdPm")){
			String orderIdPm=paramsMap.get("orderIdPm");
			if(!StringUtils.isBlank(orderIdPm)){
				Map<String, Object> qMap=new HashMap<String, Object>();
				qMap.put("payOrderId",orderIdPm);
				List<RunningSignUpInfo> sList = runningService.getEnrollInfo(qMap);
				if(sList!=null&&sList.size()!=0){
					RunningSignUpInfo rsui=sList.get(0);
					if(rsui!=null){
						if(rsui.getSignUpNo()!=null&&!StringUtils.isBlank(rsui.getSignUpNo())){
							parm1=rsui.getSignUpNo();
						}
						if(rsui.getMobile()!=null&&!StringUtils.isBlank(rsui.getMobile())){
							userId=rsui.getMobile();
						}
					}
				}
			}
			//校验用户id
			if (StringUtils.isBlank(userId) 
					|| StringUtils.isBlank(smsNo)|| StringUtils.isBlank(parm1)) {
				logger.info("/sendSMS/getSMSKz 传入参数为空");
				return;
			}
		}else{
			//校验用户id
			if (StringUtils.isBlank(userId) 
					|| StringUtils.isBlank(smsNo)|| StringUtils.isBlank(parm1)) {
				logger.info("/sendSMS/getSMSKz 传入参数为空");
				return;
			}
		}
		
		try{
			// 发送短信
			if(StringUtils.isEmpty(parm2)){
				jsonMap = sMSService.getSMSKz(userId,smsNo,parm1);	
			}else{
				jsonMap = sMSService.getSMSKz(userId,smsNo,parm1,parm2);	
			}
					
			// 处理返回结果
			String result = JsonUtil.getJsonStringFromMap(jsonMap);
			//CommonUtil.responseJson(result, response);
		} catch (Exception e) {
			logger.error("sendSMS/getSMSKz 异常:" + e.getMessage());
//			jsonMap.put("rescode", Consts.ERROR_CODE);
//			jsonMap.put("resmsg", Consts.ErrorMsg.MSG00001);
//			jsonMap.put("resmsg_cn", Message.CnDescriptionExpression.BUSINESSE_ERROR);
//			String result = JsonUtil.getJsonStringFromMap(jsonMap);
//			CommonUtil.responseJson(result, response);
		}		
	}
	
	/**
	 * 获取验证码数据检查
	 * @param paramsMap
	 * @return
	 * @throws Exception
	 */
	private Map<String,String> getCaptchaCheck(Map<String, String> paramsMap) throws Exception{
		Map<String, String> resMap = new HashMap<String,String>();
		
		// 手机号
		String mobileNum = paramsMap.get("phoneNum");
		/* 验证码类别：
			注册验证码(REGISTER), 
			登录验证码(WXLOGIN),
			重置登陆密码(FORGET_PASSWORD), 
			解绑手机(MODIFY_MOBILE),
			绑定手机(BINDING_MOBILE), 
			MODIFY_PASSWORD:修改登陆密码
			CASHDRAW:提现  
		*/
		String type = paramsMap.get("type");
		// 发送标识（是来自网站用户，还是手机用户）:1：为来自网站的；2：来自手机的
		String setupFlag = paramsMap.get("setupFlag");
		// 用户id
		String userId = paramsMap.get("userId");
		
		String userMobile = "";
		
		// 验证码类别
		if(StringUtils.isBlank(type)){
			logger.error("发送验证码数据检查失败：验证码类别为空");
			resMap.put("code", Consts.ERROR_CODE);
			resMap.put("message", Message.CnDescriptionExpression.BUSINESSE_ERROR);
			return resMap;
		}
		
		// 发送标识
		if(StrUtil.setupFlagCheck(setupFlag) == false){
			logger.error("发送验证码数据检查失败：发送标识无效！发送标识:" + setupFlag);
			resMap.put("code", Consts.ERROR_CODE);
			resMap.put("message", Message.CnDescriptionExpression.BUSINESSE_ERROR);
			return resMap;
		}
		
		// 验证码类别
		if("MODIFY_MOBILE".equals(type) || "MODIFY_PASSWORD".equals(type) || "CASHDRAW".equals(type)){
			// 用户id
			if(StringUtils.isBlank(userId)){
				logger.error("发送验证码数据检查失败：用户id为空");
				resMap.put("code", Consts.ERROR_CODE);
				resMap.put("message", Message.CnDescriptionExpression.BUSINESSE_ERROR);
				return resMap;
			}
			// 查询用户的手机号
			userMobile = captchaService.getMobileById(userId);
		}else if("REGISTER".equals(type) || "FORGET_PASSWORD".equals(type) || "BINDING_MOBILE".equals(type)){
			// 手机号
			if(StringUtils.isBlank(mobileNum)){
				logger.error("发送验证码数据检查失败：手机号为空");
				resMap.put("code", Consts.CHECK_CODE);
				resMap.put("message", Message.CnDescriptionExpression.MOBILE_IS_NULL);
				return resMap;
			}
			// 手机号合法检查
			boolean flagMobile = mobileNum.matches(Consts.PHONECHECK);
			if (!flagMobile) {
				logger.error("发送验证码数据检查失败：手机号非法");
				resMap.put("code", Consts.CHECK_CODE);
				resMap.put("message", Message.CnDescriptionExpression.MOBILE_IS_NON_STANDARD);
				return resMap;
			}
			// 判断手机号是否被使用
			int count = userService.phoneIsExisted(mobileNum);
			if("REGISTER".equals(type) ||  "BINDING_MOBILE".equals(type)){
				// 注册及其绑定手机号
				if (count > 0) {
					logger.error("发送验证码数据检查失败：注册或者绑定手机号时手机号被使用");
					resMap.put("code", Consts.CHECK_CODE);
					resMap.put("message", Message.CnDescriptionExpression.MOBILE_IS_BOUND);
					return resMap;
				}
			}else{
				//重置密码
				if (count <= 0) {
					logger.error("发送验证码数据检查失败：重置密码时手机号无注册");
					resMap.put("code", Consts.CHECK_CODE);
					resMap.put("message", Message.CnDescriptionExpression.MOBILE_NOT_EXIST);
					return resMap;
				}
			}
			userMobile = mobileNum;
		}else if("WXLOGIN".equals(type)){
			// 手机号
			if(StringUtils.isBlank(mobileNum)){
				logger.error("发送验证码数据检查失败：手机号为空");
				resMap.put("code", Consts.CHECK_CODE);
				resMap.put("message", Message.CnDescriptionExpression.MOBILE_IS_NULL);
				return resMap;
			}
			// 手机号合法检查
			boolean flagMobile = mobileNum.matches(Consts.PHONECHECK);
			if (!flagMobile) {
				logger.error("发送验证码数据检查失败：手机号非法");
				resMap.put("code", Consts.CHECK_CODE);
				resMap.put("message", Message.CnDescriptionExpression.MOBILE_IS_NON_STANDARD);
				return resMap;
			}
			userMobile = mobileNum;
		}else {
			logger.error("发送验证码数据检查失败：验证码类别无效！验证码类别：" + type);
			resMap.put("code", Consts.ERROR_CODE);
			resMap.put("message", Message.CnDescriptionExpression.BUSINESSE_ERROR);
			return resMap;
		}
		
		resMap.put("userMobile", userMobile);
		resMap.put("code", Consts.SUCCESS_CODE);
		resMap.put("message", Consts.SUCCESS_DESCRIBE);
		return resMap;
	}
	
	
	/** 手动发送短信内容
	 * @param request
	 * @return response
	 * @throws Exception */
	@RequestMapping(value = "/setSMS")
	public void setSMS(HttpServletRequest request, HttpServletResponse response){
		Map<String, Object> jsonMap = new HashMap<String, Object>();
		
		// 解密请求参数
		Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
	
		String mobile = paramsMap.get("mobile");//手机号
		String context = paramsMap.get("context");//内容
		//校验用户id
		if (StringUtils.isBlank(mobile) 
				|| StringUtils.isBlank(context)) {
			logger.info("/sendSMS/setSMS 传入参数为空");
			return;
		}
		try{
			// 发送短信
			jsonMap = sMSService.setSMS(mobile,context);	
			// 处理返回结果
			String result = JsonUtil.getJsonStringFromMap(jsonMap);
			//CommonUtil.responseJson(result, response);
		} catch (Exception e) {
			logger.error("sendSMS/getSMS 异常:" + e.getMessage());
//			jsonMap.put("rescode", Consts.ERROR_CODE);
//			jsonMap.put("resmsg", Consts.ErrorMsg.MSG00001);
//			jsonMap.put("resmsg_cn", Message.CnDescriptionExpression.BUSINESSE_ERROR);
//			String result = JsonUtil.getJsonStringFromMap(jsonMap);
//			CommonUtil.responseJson(result, response);
		}		
	}
	
	/**
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping(value = "/sendSMS")
	public void sendSMS(HttpServletRequest request, HttpServletResponse response){
		
		// 解密请求参数
		Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
		
		//Method名称：
		String smsNo=paramsMap.get("smsNo");
		String logInfo=paramsMap.get("logInfo");
		String mobile=paramsMap.get("mobile");
		String smsParams=paramsMap.get("smsParams").toString();
		
		if (StringUtils.isBlank(smsNo) 
				|| StringUtils.isBlank(logInfo)|| StringUtils.isBlank(mobile)) {
			logger.info("/sendSMS/sendSMS 传入参数为空");
			return;
		}
		try{
			this.sMSService.sendSMS(logInfo, mobile, smsNo, smsParams.split(","));
		} catch (Exception e) {
			logger.error("sendSMS/sendSMS 异常:" ,e);
		}		
		
	}
	
}
